package controllers.interfaces;

import controllers.PermissionList;

import person.User;

/**
 * @author  Marco
 */
public interface SessionController {
	/*Query di sessione*/
	/**
	 * <h1>Funzione di Login</h1>
	 * procedura di login</p>
	 *<h3> possibili eccezioni:</h3>
	 * <ul>
	 * 	<li><b>LOGIN_ERROR</b>: Nome utente o password non corrispondenti</li>
	 * 	<li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li>
	 * 	<li><b>FIELD_ERROR</b>:Caratteri non ammessi, oppure campo vuoto</li>
	 * </ul>
	 * @return <b>String</b>: Access Token
	 * */
	public void login(String userName,String password)throws Exception;
	
	/**
	 * <h1>Funzione di Logout</h1>
	 * Effettua il Logout alla piattaforma chiudendo la sessione.
	 * <h3> possibili eccezioni:</h3>
	 * <ul>
	 * 	<li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li>
	 * 	<li><b>INVALID_REQUEST</b>:Nel caso in cui non ci sia nessuna sessione avviata</li>
	 *  <li><b>INVALID_TOKEN</b>: Il token della sessione non � valido</li>
	 * </ul>
	 * */
	public void logout()throws Exception;
	
	/**
	 * <h1>Utente loggato</h1> Ottiene un istannza di User contenente l'utente loggato <h3> possibili eccezioni:</h3> <ul> <li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li> <li><b>INVALID_TOKEN</b>: Il token della sessione non � valido</li> </ul>
	 * @return   <b>User</b>: utente loggato
	 * @see  User
	 */
	public User getCurrentUser()throws Exception;
	
	/**
	 * <h1>Registra utente</h1>
	 * Registra un utente consentendogli l'accesso alla piattaforma
	 * <h3> possibili eccezioni:</h3>
	 * <ul>
	 * 	<li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li>
	 * 	<li><b>EXIST_ERROR</b>: Nel caso in cui l'utente che si cerca di registrare esista gia</li>
	 * 	<li><b>INVALID_REQUEST</b>:Nel caso in cui l'utente non sia registrabile</li>
	 * </ul>
	 * @see User
	 * */
	public void registerUser(User user,String userName,String password)throws Exception;
	/**
	 * <h1>Rimuovi utente</h1>
	 * Rimuove un utente impedendo futuri accessi da parte dello stesso
	 * <h3> possibili eccezioni:</h3>
	 * <ul>
	 * 	<li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li>
	 * 	<li><b>NOT_FOUND_ERROR</b>:Nel caso in cui l'utente non esista </li>
	 * 	<li><b>INVALID_REQUEST</b>:Nel caso in cui non ci sia nessuna sessione avviata</li>
	 *  <li><b>INVALID_TOKEN</b>: Il token della sessione non � valido</li>
	 * 	<li><b>PERMISSION_ERROR</b>: Non ci sono permessi sufficienti per effettuare questa operazione</li>
	 * </ul>
	 * @see User
	 * */
	public void removeUser(User user)throws Exception;
	/**
	 * <h1>Ottieni permessi</h1>
	 * Ottiene i permessi di un utente
	 * <h3> possibili eccezioni:</h3>
	 * <ul>
	 * 	<li><b>CONNECTION_ERROR</b>: Errore di accesso alla sorgente dati</li>
	 * 	<li><b>NOT_FOUND_ERROR</b>:Nel caso in cui l'utente non esista </li>
	 * 	<li><b>INVALID_REQUEST</b>:Nel caso in cui non ci sia nessuna sessione avviata</li>
	 *  <li><b>INVALID_TOKEN</b>: Il token della sessione non � valido</li>
	 * 	<li><b>PERMISSION_ERROR</b>: Non ci sono permessi sufficienti per effettuare questa operazione</li>
	 * </ul>
	 * @throws Exception 
	 * @see User
	 * */
	public PermissionList getPermissions() throws Exception;
	public void modifyUserPassword(String password) throws Exception;
}
